package it.unipd.dei.bd.icineasti.servlet.admin;

import it.unipd.dei.bd.icineasti.servlet.AbstractDatabaseServlet;

import it.unipd.dei.bd.icineasti.database.UpdateSalaDatabase;
import it.unipd.dei.bd.icineasti.database.CreatePoltroneDatabase;
import it.unipd.dei.bd.icineasti.database.GetElencoPoltroneInSalaDatabase;
import it.unipd.dei.bd.icineasti.database.DeletePoltroneListDatabase;
import it.unipd.dei.bd.icineasti.resource.Sala;
import it.unipd.dei.bd.icineasti.resource.Poltrona;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Riceve i dati aggiornati di una sala e tenta un aggiornamento del db.
 * 
 * Compie tre o quattro accessi al database:
 * 1 - genera la lista delle poltrone attualmente presenti in sala;
 * 2 - basandosi sulla nuova disposizione delle poltrone genera due liste:
 * 		a) poltrone da rimuovere;
 * 		b) poltrone da aggiungere;
 * 	   di conseguenza accede al database per applicare le
 * 	   informazioni di queste due liste.
 * 3 - aggiorna anche i dati della sala, sia che siano stati modificati che no.
 * 
 * @author Bardelle Renzo
 * @version 1.00
 */

public class UpdateSalaServlet extends AbstractDatabaseServlet {

	public void doPost(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		
		HttpSession session = req.getSession(true);
		
		res.setContentType("text/html");

		PrintWriter out = res.getWriter();

		Connection con = null;
		
		int idSala = Integer.parseInt(req.getParameter("idsala"));
		int totalePosti = Integer.parseInt(req.getParameter("totaleposti"));
		String csvPoltrone = req.getParameter("csvpoltrone");
		String sigla = req.getParameter("sigla");
		String nome = req.getParameter("nome");
		int codiceSede = Integer.parseInt(req.getParameter("codicesede"));
		
		if(session.getAttribute("amministrativo") != null )
		{			
			ArrayList<Poltrona> poltrone = new ArrayList<Poltrona>();
			
			String[] poltroneFilaNumero = csvPoltrone.split(",");
		
			for(int i=0;i<poltroneFilaNumero.length;i++)
			{
				poltrone.add(new Poltrona(-1,poltroneFilaNumero[i].charAt(0)+"",Integer.parseInt(poltroneFilaNumero[i].substring(1)),true, idSala));
			}
			
			ArrayList<Poltrona> oldPoltrone = null;
			
			try {
				con = DS.getConnection();

				oldPoltrone = new GetElencoPoltroneInSalaDatabase(con, idSala).elencaPoltrone();
				
				out.println("<p><font color=\"green\" size=\"+2\">Acquisite le vecchie poltrone in sala.</font></p>");
				
			} catch (NullPointerException ex) {
				out.printf("<p><font color=\"red\" size=\"+2\">Impossibile creare la connessione al database nella verifica delle vecchie poltrone in sala.</font></p>");
			} catch (SQLException ex) {
				out.printf(
						"<p><font color=\"red\" size=\"+2\">Errore durante l'accesso al database nella verifica delle vecchie poltrone in sala: %s</font></p>",
						ex.getMessage());
			}
			
			/* Confronto poltrone O(n^2): tanto alla peggio ho 1000 poltrone e questa è un'operazione "rara"
			 * Voglio trovare le nuove poltrone da inserire e le vecchie da eliminare.
			 * Nello specifico cerco:
			 * 		le poltrone della lista "poltrone" che sono oldPoltrone;
			 * 		le poltrone della lista "oldPoltrone" che NON sono in poltrone.
			 */
			
			ArrayList<Poltrona> daEliminare = new ArrayList<Poltrona>();
			ArrayList<Poltrona> daAggiungere = new ArrayList<Poltrona>();
			
			for(Poltrona op:oldPoltrone)
				if(!poltrone.contains(op))
					daEliminare.add(op);
			
			for(Poltrona np:poltrone)
				if(!oldPoltrone.contains(np))
					daAggiungere.add(np);
			
			if(daEliminare.size()>0)
				try {
					con = DS.getConnection();
					
					new DeletePoltroneListDatabase(con, daEliminare).deletePoltrone();
					
					out.println("<p><font color=\"green\" size=\"+2\">Eliminate le poltrone in eccesso.</font></p>");
					
					totalePosti -= daEliminare.size();
					
				} catch (NullPointerException ex) {
					out.printf("<p><font color=\"red\" size=\"+2\">Impossibile creare la connessione al database per eliminare le poltrone in eccesso.</font></p>");
				} catch (SQLException ex) {
					out.printf(
							"<p><font color=\"red\" size=\"+2\">Errore durante l'accesso al database per eliminare le poltrone in eccesso: %s</font></p>",
							ex.getMessage());
				}
			
			if(daAggiungere.size()>0)
				try {
					con = DS.getConnection();

					new CreatePoltroneDatabase(con, idSala, daAggiungere).createPoltrone();
					
					out.println("<p><font color=\"green\" size=\"+2\">Create le nuove poltrone.</font></p>");
					
					totalePosti += daAggiungere.size();
					
				} catch (NullPointerException ex) {
					out.printf("<p><font color=\"red\" size=\"+2\">Impossibile creare la connessione al database per create le nuove poltrone.</font></p>");
				} catch (SQLException ex) {
					out.printf(
							"<p><font color=\"red\" size=\"+2\">Errore durante l'accesso al database per creare le nuove poltrone: %s</font></p>",
							ex.getMessage());
				}
			
			Sala sala=new Sala(sigla,nome,totalePosti,codiceSede,idSala);
			
			try {
				con = DS.getConnection();

				new UpdateSalaDatabase(con, sala).updateSala();
				
				out.println("<p><font color=\"green\" size=\"+2\">Parametri della sala aggiornati.</font></p>");
				
			} catch (NullPointerException ex) {
				out.printf("<p><font color=\"red\" size=\"+2\">Impossibile creare la connessione al database per aggiornare i parametri della sala.</font></p>");
			} catch (SQLException ex) {
				out.printf(
						"<p><font color=\"red\" size=\"+2\">Errore durante l'accesso al database per aggiornare i parametri della sala: %s</font></p>",
						ex.getMessage());
			}

		}
		else
		{
			out.println("<p><font color=\"red\" size=\"+2\">Non hai i privilegi di amministrazione quindi non puoi modificare il database.</font></p>");
		}
		
		out.flush();
		out.close();
	}
}
